//
//  main.c
//  Questions
//
//  Created by wangrui.
//  Copyright (c) 2014年 wangrui. All rights reserved.
//

/*
 *图的割边
 *
 *2014-10-10 16:24:03
 *测试数据:
	6 6
	1 4
	1 3
	4 2
	3 2
	2 5
	5 6
 */

#include <stdio.h>
#include <stdlib.h>
#include "cutils.h"

#ifdef DEBUG
#undef DEBUG
#define DEBUG 1
#endif

#define MMIN(a,b) ((a)>(b)? (b):(a))

#define MaxSize 10
int num[MaxSize]; //各个点访问的时间戳
int low[MaxSize]; //各个点不经过父节点能访问的最小时间戳

int e[MaxSize][MaxSize];//邻接矩阵
int idx = 0;//用于确定时间戳

int root = 1;//根节点位置
int v; //总顶点数

/**
 *  深度优先遍历
 *
 *  @param cur    当前节点
 *  @param father 父节点
 */
void dfs(int cur, int father)
{
	idx++;
	
	num[cur] = idx;
	low[cur] = idx;
	
	for (int i=1; i<=v; i++) {
		
		if (e[cur][i] == 1) {//判断是否能到下一个子节点(能否连通)
			
			if (num[i] == 0) {//时间戳为0,表示未访问过
				
				dfs(i, cur);
	
				low[cur] = MMIN(low[cur], low[i]);//更新能访问到的最小时间戳(子节点能访问小的时间戳时,父节点肯定也能访问这个较小的时间戳)

				if (low[i] > num[cur]) {//当儿子节点访问的最小时间戳大于父亲的时间戳
					printf("%d-%d\n",cur,i);
				}
			}
			
			else if (i != father) {//访问过的子节点
				
				low[cur] = MMIN(low[cur],num[i]);//更新能访问到的最小时间戳(因为能访问到i节点，所以i节点的时间戳如果是小的，则可以更新当前时间戳)
			}
		}
	}
}

/**
 *  main 函数
 *
 *  @param argc
 *  @param argv
 *
 *  @return 0
 */
int main(int argc, const char * argv[])
{
	
	int n,m;
	scanf("%d %d",&n,&m);
	v = n;
	
	for (int i=1; i<=n; i++) {
		for (int j=0; j<=n; j++) {
			e[i][j] = 0; //0表示不连通
		}
	}
	
	for (int i=1; i<=m; i++) {
		int x,y;
		scanf("%d %d",&x,&y);
		e[x][y] = 1;
		e[y][x] = 1;
	}
	
	dfs(root,root);
	
	return 0;
}


